iT邦幫忙

2024 iThome 鐵人賽

DAY 24
0

隨著 DevOps 實踐的普及,基礎架構即程式碼 (Infrastructure as Code, IaC) 已成為現代 IT 管理的重要措施。而 Terraform 作為一款跨平台的 IaC 工具,讓我們可以方便地自動化和管理 Kubernetes 叢集中的資源。


什麼是 Terraform?

https://ithelp.ithome.com.tw/upload/images/20241008/20169492g2BjIMRL8A.png
圖片來源

Terraform 是一個開源的基礎架構即程式碼 (IaC) 工具,它允許我們使用程式碼來定義、佈署、更新和管理基礎架構資源。與手動配置和維護相比,Terraform 可以讓佈署和管理基礎架構的流程更加自動化,可複用性更高。

主要功能包括:

  1. 跨平台支援:Terraform 可以同時管理 AWS、Azure、Google Cloud 等多種雲端平台和 Kubernetes 叢集。
  2. 狀態管理:Terraform 會記錄基礎架構的狀態,這樣它可以追蹤已經應用的變更,確保所有變更都按照預期進行。
  3. 模組化架構:基礎架構定義可以被拆解為模組,讓我們在不同的專案或環境中復用相同的架構設計。

為何使用 Terraform 管理 Kubernetes?

Terraform 提供了一個統一的介面來定義和管理 Kubernetes 叢集中的所有資源,無論是 DeploymentService 還是 Namespace,都可以通過程式碼進行管理。以下是幾個使用 Terraform 管理 Kubernetes 的優勢:

  1. 自動化佈署:無需手動設定,可以自動化佈署 Kubernetes 資源。
  2. 一致性與可複用:可以在多個環境中佈署一致的資源,避免手動操作的錯誤。
  3. 版本控制:允許將基礎架構配置納入版本控制,便於回退到先前版本。
  4. 跨平台支持:支援多種雲端供應商,同時可以管理不同平台的基礎架構。

如何使用 Terraform 管理 Docker Desktop Kubernetes 叢集

安裝 Terraform

在Windows本機環境用 Chocolatey 安裝 Terraform

choco install terraform

安裝完成後,我們可以使用 terraform --version 檢查是否安裝成功。

撰寫 Terraform 配置文件

在專案目錄中創建一個新的目錄,並撰寫 Terraform 配置文件來定義 Kubernetes 資源。

providers.tf

provider "kubernetes" {
  config_path = "~/.kube/config"  # 使用本機的 kubeconfig 文件來連接 Kubernetes 叢集
}

main.tf

resource "kubernetes_namespace" "example-ns" {
  metadata {
    name = "example-ns"
  }
}

resource "kubernetes_deployment" "nginx" {
  metadata {
    name = "nginx"
    namespace = kubernetes_namespace.example-ns.metadata[0].name
  }

  spec {
    replicas = 2

    selector {
      match_labels = {
        app = "nginx"
      }
    }

    template {
      metadata {
        labels = {
          app = "nginx"
        }
      }

      spec {
        container {
          image = "nginx:latest"
          name  = "nginx"
          port {
            container_port = 80
          }
        }
      }
    }
  }
}

以下是對 main.tf 的說明:

kubernetes_namespace 資源

命名空間(Namespace)用於將 Kubernetes 叢集中的資源進行邏輯隔離。通過將不同應用的資源放在不同命名空間中,可以避免資源名稱的衝突,並提高管理的靈活性。

resource "kubernetes_namespace" "example-ns" {
  metadata {
    name = "example-ns"
  }
}
  • resource:這是 Terraform 用來定義各種資源的關鍵字。這裡指定了 kubernetes_namespace 來創建一個新的 Kubernetes Namespace。
  • "example-ns":這是資源的名稱,讓 Terraform 可以引用它。這個名稱應該在同一 Terraform 模塊中保持唯一。
  • metadata:定義 Kubernetes Namespace 的詮釋資料。這裡的 name 定義了命名空間的名稱為 example-ns

kubernetes_deployment 資源

resource "kubernetes_deployment" "nginx" {
  metadata {
    name = "nginx"
    namespace = kubernetes_namespace.example-ns.metadata[0].name
  }

  spec {
    replicas = 2

    selector {
      match_labels = {
        app = "nginx"
      }
    }

    template {
      metadata {
        labels = {
          app = "nginx"
        }
      }

      spec {
        container {
          image = "nginx:latest"
          name  = "nginx"
          port {
            container_port = 80
          }
        }
      }
    }
  }
}
  • resource "kubernetes_deployment":定義 Kubernetes 中的 Deployment 資源。Deployment 負責管理 Pod 的生命週期,確保應用程式穩定運行。
  • metadata:Deployment 的詮釋資料。
    • name:定義 Deployment 名稱為 nginx
    • namespace:將這個 Deployment 放置在我們之前定義的命名空間 example-ns 中。使用 kubernetes_namespace.example-ns.metadata[0].name 引用這個命名空間。
  • spec:定義 Deployment 的具體配置。
    • replicas:定義應用需要運行的 Pod 副本數量,這裡設定為 2。
    • selector:使用標籤來選擇 Deployment 中要管理的 Pod。這裡的標籤 app = "nginx" 用來指定這些 Pod 屬於 nginx 應用。
  • template:定義 Pod 模板,描述 Pod 的具體運行配置。
    • metadata.labels:指定 Pod 的標籤為 app = "nginx",這裡的標籤會匹配 Deployment 中的 selector。
    • spec.container:定義 Pod 中運行的容器。
      • image:指定使用 nginx:latest 映像來運行容器。
      • name:容器名稱為 nginx
      • port:定義容器暴露的端口,這裡容器的 container_port 為 80。

用途

  • Deployment 負責管理應用的 Pod 副本。當副本數量設置為 2 時,Kubernetes 會啟動兩個相同的 NGINX 容器,以確保應用的高可用性。Deployment 還支持滾動更新等功能,使得應用的升級過程更加平滑。

初始化並應用配置

初始化 Terraform 工作目錄,並檢查佈署計劃:

terraform init   # 初始化 Terraform
terraform plan   # 檢查配置
terraform apply  # 應用配置

成功佈署後,Terraform 將自動創建指定的 Namespace 和 Deployment,這些資源可以使用 kubectl 命令進行驗證:

kubectl get namespaces
kubectl get deployments -n example-ns

更新與刪除資源

修改 Terraform 配置文件後,再次執行 terraform apply 即可更新資源。

若需刪除資源,則使用 terraform destroy


補充: 什麼是Metadata?

Metadata臺灣又常譯作詮釋資料、後設資料、中介資料、中繼資料,也有人稱元資料、元數據。是指描述其他資料的資訊,例如資料的組織、結構、內容及其屬性。這些資訊有助於管理、發現和理解資料,而非直接包含在資料本身中。可以描述資料的格式、來源、時間戳記等重要特徵,可以有效管理大量資料和提高資料利用率。

「Metadata」在不同領域學科中,因為不同觀點而有不盡相同的解釋與定位,在中文上亦有多種翻譯:

  • 詮釋資料:強調對於資料做某種程度的註解,讓使用者瞭解資料內涵(內容物、生產時間等訊息)。
  • 元資料、元數據:強調是所有資料的源頭。
  • 超資料:在不同Data之間的總綱領,並且期望其可以做到超連結。
  • 後設資料:強調是在原始資料產生後才製作的,因為強調事後生產,所以翻譯成後設資料。

小結

透過 Terraform,我們能夠輕鬆管理和自動化 Kubernetes 叢集中的資源佈署。即使在本機的 Docker Desktop Kubernetes 環境中,使用 Terraform 來管理基礎架構仍然能帶來一致性、可複用性和自動化的優勢。隨著基礎架構需求的增長,Terraform 讓 DevOps 團隊能夠更快地進行變更,並確保整體系統的穩定性!


參考文件


上一篇
Day23 - Infrastructure as Code (IaC) 基礎架構即程式碼
下一篇
Day25 - 安全的 DevOps 流程:DevSecOps介紹
系列文
DevOps菜鳥的30天實踐挑戰:從 CI/CD Pipeline 到雲端佈署30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言